import com.fasterxml.jackson.databind.ObjectMapper;
import com.mysql.jdbc.jdbc2.optional.MysqlDataSource;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.sql.DataSource;
import java.io.IOException;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;


@WebServlet("/bbq")
public class MyServlet extends HttpServlet {
    // 创建映射器,来读取数据
    private ObjectMapper objectMapper = new ObjectMapper();

    // 引入数据库


    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
          // 请求 里是 json 数据, 使用 jackson 来读取数据 ;
       Body body =   objectMapper.readValue(req.getInputStream() , Body.class) ;
        //在服务器 打印 请求中收到的 数据
        System.out.println("在请求中收到的数据" + body);

        //往数据库插入数据
        try {
            save(body) ;
        } catch (SQLException e) {
            e.printStackTrace();
        }

        // 返回响应
        resp.setStatus(200);
        // 响应里一般也用 请求一样的格式,这里也用json
        resp.getWriter().write("ok");
//        resp.setContentType("application/json; charset=utf8");
//        resp.getWriter().write("{ ok : true }");
    }


    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
         // 这个方法来处理,获取数据的get请求 ; 没有什么参数,直接返回数据

        //设置好状态 ;
        resp.setStatus(200);
        resp.setContentType("application/json; charset=utf8");

        // 在数据库里查询数据,
        List<Body> list = null;
        try {
            list = load();
        } catch (SQLException e) {
            e.printStackTrace();
        }

        //将 数据构造成 json , 返回响应
        String respJson = objectMapper.writeValueAsString(list) ;
        resp.getWriter().write(respJson);

    }

    //1.  创建一个 成员,来存储数据库的数据源 ;
        private DataSource dataSource = new MysqlDataSource() ;
     // 重写一个 init , 用来  创建数据源
    //init 刚好就是 servlet 创建时,进行初始化的方法 ;
    @Override
    public void init() throws ServletException {
        // 创建数据源
        ((MysqlDataSource) dataSource ).setUrl
                ("jdbc:mysql://127.0.0.1:3306/message_wall?characterEncoding=utf8&useSSL=false");
        ((MysqlDataSource) dataSource ).setUser("root");
        ((MysqlDataSource) dataSource ).setPassword("0118");
    }

    //往数据库里 插入数据
    private void save(Body body) throws SQLException {
        // 使用jdbc
        //2. 建立连接
        Connection connection = dataSource.getConnection() ;

        //3. 构造sql
        String sql = "insert into message values(?,?,?)" ;
        PreparedStatement statement = connection.prepareStatement(sql);
        statement.setString(1, body.from);
        statement.setString(2, body.to);
        statement.setString(3,body.msg);

        //4. 执行sql
        statement.executeUpdate();

        //5. 回收资源 statement , connection ,
        statement.close();
        connection.close();
    }


    // 在数据数据库里查询数据
    private List<Body> load() throws SQLException {
        // 不必创建数据源了 ;
        // 1. 建立连接
        Connection connection = dataSource.getConnection();

        //2. 创建sql
        String sql = "select * from message" ;
        PreparedStatement statement = connection.prepareStatement(sql);

        List<Body> list = new ArrayList<>() ;
        //3. 执行sql
        ResultSet resultSet = statement.executeQuery(sql);
        while (resultSet.next()){
            Body body = new Body();
            body.from = resultSet.getString("from") ;
            body.to = resultSet.getString("to") ;
            body.msg = resultSet.getString("msg") ;
            list.add(body) ;
        }

        //4. 回收资源
        resultSet.close();
        statement.close();
        connection.close();

        return list ;
    }
}

class Body{      // 创建数据的数据类
    public String from ;  //这里属性的名字,要和前面约定好的数据格式相同
    public String to ;
    public String msg ;

    @Override
    public String toString() {
        return "Body{" +
                "from='" + from + '\'' +
                ", to='" + to + '\'' +
                ", msg='" + msg + '\'' +
                '}';
    }
}
